﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HTTT.DataAccess.DataInf;
using HTTT.Utilities;
using System.Data.Objects;

namespace HTTT.DataAccess
{
    public class HT_OUDAO : IHT_OUDAO
    {
        private static AppEntities dataContext;
        
        private IRepository<HT_OU> repository;
        public HT_OUDAO()
        {
            dataContext = new AppEntities();
            repository = new RepositoryDAO<HT_OU>(dataContext);
        }

        public IEnumerable<HT_OU> GetAllHT_OU()
        {
            var q = (from m in dataContext.HT_OU
                     select m).Take(500);
            return q;
        }
        public HT_OU GetHT_OUByID(Guid id)
        {
            return repository.Find(obj => obj.ID == id).SingleOrDefault();
        }
        public HT_OU GetLastRecord()
        {
            return dataContext.HT_OU.OrderByDescending(obj => obj.ID).FirstOrDefault();
        }

        public bool UpdateHT_OU(HT_OU inHT_OU)
        {
            if (inHT_OU == null) return false;
            HT_OU upHT_OU = repository.First(sobj => sobj.ID == inHT_OU.ID);

            if (upHT_OU == null) return false;

            upHT_OU.Name = inHT_OU.Name;
            upHT_OU.DistinguishedName = inHT_OU.DistinguishedName;
            return repository.SaveChanges() > 0;

        }
        public ReturnValue<bool> InsertHT_OU(HT_OU inHT_OU)
        {
            if (inHT_OU == null) return new ReturnValue<bool>(false, "Input data null");
            repository.Add(inHT_OU);
            return new ReturnValue<bool>(repository.SaveChanges() > 0, "Input data null");
        }

        public ReturnValue<HT_OU> InsertHT_OUAndReturn(HT_OU inHT_OU)
        {
            if (inHT_OU == null) return new ReturnValue<HT_OU>(null, "Input value not valid");
            HT_OU ret = repository.AddAndReturn (inHT_OU);
            return new ReturnValue<HT_OU>(ret, "Successfull");
        }

        public ReturnValue<bool> DelHT_OU(Guid id)
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            try
            {
                HT_OU objDel = repository.First(obj => obj.ID == id);
                ret = DelHT_OU(objDel);
            }
            catch (Exception)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }

        public ReturnValue<bool> DelAllHT_OU()
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            try
            {
                int result = dataContext.ExecuteStoreCommand("DELETE FROM HT_OU");
                return new ReturnValue<bool>(result > 0, "Xóa toàn bộ thành công");
            }
            catch (Exception)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }


        public ReturnValue<bool> DelHT_OU(HT_OU inHT_OU)
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            if (inHT_OU == null)
            {
                ret.Msg = "input null";
                return ret;
            }
            try
            {
                repository.Delete(inHT_OU);
                ret.RetValue = repository.SaveChanges() > 0;
            }
            catch (System.Exception)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }

        public bool IsOUExist(string path)
        {
            return repository.Exist(m => m.DistinguishedName == path);
            
        }

        public HT_OU GetHT_OUByDistigutedName(string distigutedName)
        {
            return repository.Find(obj => obj.DistinguishedName == distigutedName).SingleOrDefault();
        }

        public bool IsInOU(string path)
        {
            int count = dataContext.HT_OU.Count(m => m.DistinguishedName.Contains(path));
            if (count > 1)
                return true;
            else
                return false;
        }
    }
}
